home *** CD-ROM | disk | FTP | other *** search
/ Openstep 4.2 (Developer) / Openstep Developer 4.2.iso / NextDeveloper / Source / GNU / perl / Perl / ext / GDBM_File / GDBM_File.xs < prev    next >
Encoding:
Text File  |  1995-06-22  |  4.0 KB  |  246 lines

  1. #include "EXTERN.h"
  2. #include "perl.h"
  3. #include "XSUB.h"
  4.  
  5. #include <gdbm.h>
  6. #include <fcntl.h>
  7.  
  8. typedef GDBM_FILE GDBM_File;
  9.  
  10. #define GDBM_BLOCKSIZE 0 /* gdbm defaults to stat blocksize */
  11. #define gdbm_TIEHASH(dbtype, name, read_write, mode, fatal_func) \
  12.     gdbm_open(name, GDBM_BLOCKSIZE, read_write, mode, fatal_func)
  13.  
  14. #define gdbm_FETCH(db,key)            gdbm_fetch(db,key)
  15. #define gdbm_STORE(db,key,value,flags)        gdbm_store(db,key,value,flags)
  16. #define gdbm_DELETE(db,key)            gdbm_delete(db,key)
  17. #define gdbm_FIRSTKEY(db)            gdbm_firstkey(db)
  18. #define gdbm_NEXTKEY(db,key)            gdbm_nextkey(db,key)
  19.  
  20. typedef datum gdatum;
  21.  
  22. typedef void (*FATALFUNC)();
  23.  
  24. static int
  25. not_here(s)
  26. char *s;
  27. {
  28.     croak("GDBM_File::%s not implemented on this architecture", s);
  29.     return -1;
  30. }
  31.  
  32. /* Versions of gdbm prior to 1.7x might not have the gdbm_sync,
  33.    gdbm_exists, and gdbm_setopt functions.  Apparently Slackware
  34.    (Linux) 2.1 contains gdbm-1.5 (which dates back to 1991).
  35. */
  36. #ifndef GDBM_FAST
  37. #define gdbm_exists(db,key) not_here("gdbm_exists")
  38. #define gdbm_sync(db) (void) not_here("gdbm_sync")
  39. #define gdbm_setopt(db,optflag,optval,optlen) not_here("gdbm_setopt")
  40. #endif
  41.  
  42. static double
  43. constant(name, arg)
  44. char *name;
  45. int arg;
  46. {
  47.     errno = 0;
  48.     switch (*name) {
  49.     case 'A':
  50.     break;
  51.     case 'B':
  52.     break;
  53.     case 'C':
  54.     break;
  55.     case 'D':
  56.     break;
  57.     case 'E':
  58.     break;
  59.     case 'F':
  60.     break;
  61.     case 'G':
  62.     if (strEQ(name, "GDBM_CACHESIZE"))
  63. #ifdef GDBM_CACHESIZE
  64.         return GDBM_CACHESIZE;
  65. #else
  66.         goto not_there;
  67. #endif
  68.     if (strEQ(name, "GDBM_FAST"))
  69. #ifdef GDBM_FAST
  70.         return GDBM_FAST;
  71. #else
  72.         goto not_there;
  73. #endif
  74.     if (strEQ(name, "GDBM_FASTMODE"))
  75. #ifdef GDBM_FASTMODE
  76.         return GDBM_FASTMODE;
  77. #else
  78.         goto not_there;
  79. #endif
  80.     if (strEQ(name, "GDBM_INSERT"))
  81. #ifdef GDBM_INSERT
  82.         return GDBM_INSERT;
  83. #else
  84.         goto not_there;
  85. #endif
  86.     if (strEQ(name, "GDBM_NEWDB"))
  87. #ifdef GDBM_NEWDB
  88.         return GDBM_NEWDB;
  89. #else
  90.         goto not_there;
  91. #endif
  92.     if (strEQ(name, "GDBM_READER"))
  93. #ifdef GDBM_READER
  94.         return GDBM_READER;
  95. #else
  96.         goto not_there;
  97. #endif
  98.     if (strEQ(name, "GDBM_REPLACE"))
  99. #ifdef GDBM_REPLACE
  100.         return GDBM_REPLACE;
  101. #else
  102.         goto not_there;
  103. #endif
  104.     if (strEQ(name, "GDBM_WRCREAT"))
  105. #ifdef GDBM_WRCREAT
  106.         return GDBM_WRCREAT;
  107. #else
  108.         goto not_there;
  109. #endif
  110.     if (strEQ(name, "GDBM_WRITER"))
  111. #ifdef GDBM_WRITER
  112.         return GDBM_WRITER;
  113. #else
  114.         goto not_there;
  115. #endif
  116.     break;
  117.     case 'H':
  118.     break;
  119.     case 'I':
  120.     break;
  121.     case 'J':
  122.     break;
  123.     case 'K':
  124.     break;
  125.     case 'L':
  126.     break;
  127.     case 'M':
  128.     break;
  129.     case 'N':
  130.     break;
  131.     case 'O':
  132.     break;
  133.     case 'P':
  134.     break;
  135.     case 'Q':
  136.     break;
  137.     case 'R':
  138.     break;
  139.     case 'S':
  140.     break;
  141.     case 'T':
  142.     break;
  143.     case 'U':
  144.     break;
  145.     case 'V':
  146.     break;
  147.     case 'W':
  148.     break;
  149.     case 'X':
  150.     break;
  151.     case 'Y':
  152.     break;
  153.     case 'Z':
  154.     break;
  155.     }
  156.     errno = EINVAL;
  157.     return 0;
  158.  
  159. not_there:
  160.     errno = ENOENT;
  161.     return 0;
  162. }
  163.  
  164. MODULE = GDBM_File    PACKAGE = GDBM_File    PREFIX = gdbm_
  165.  
  166. double
  167. constant(name,arg)
  168.     char *        name
  169.     int        arg
  170.  
  171.  
  172. GDBM_File
  173. gdbm_TIEHASH(dbtype, name, read_write, mode, fatal_func = (FATALFUNC)croak)
  174.     char *        dbtype
  175.     char *        name
  176.     int        read_write
  177.     int        mode
  178.     FATALFUNC    fatal_func
  179.  
  180. void
  181. gdbm_close(db)
  182.     GDBM_File    db
  183.     CLEANUP:
  184.  
  185. void
  186. gdbm_DESTROY(db)
  187.     GDBM_File    db
  188.     CODE:
  189.     gdbm_close(db);
  190.  
  191. gdatum
  192. gdbm_FETCH(db, key)
  193.     GDBM_File    db
  194.     datum        key
  195.  
  196. int
  197. gdbm_STORE(db, key, value, flags = GDBM_REPLACE)
  198.     GDBM_File    db
  199.     datum        key
  200.     datum        value
  201.     int        flags
  202.     CLEANUP:
  203.     if (RETVAL) {
  204.         if (RETVAL < 0 && errno == EPERM)
  205.         croak("No write permission to gdbm file");
  206.         croak("gdbm store returned %d, errno %d, key \"%.*s\"",
  207.             RETVAL,errno,key.dsize,key.dptr);
  208.         /* gdbm_clearerr(db); */
  209.     }
  210.  
  211. int
  212. gdbm_DELETE(db, key)
  213.     GDBM_File    db
  214.     datum        key
  215.  
  216. gdatum
  217. gdbm_FIRSTKEY(db)
  218.     GDBM_File    db
  219.  
  220. gdatum
  221. gdbm_NEXTKEY(db, key)
  222.     GDBM_File    db
  223.     datum        key
  224.  
  225. int
  226. gdbm_reorganize(db)
  227.     GDBM_File    db
  228.  
  229.  
  230. void
  231. gdbm_sync(db)
  232.     GDBM_File    db
  233.  
  234. int
  235. gdbm_exists(db, key)
  236.     GDBM_File    db
  237.     datum        key
  238.  
  239. int
  240. gdbm_setopt (db, optflag, optval, optlen)
  241.     GDBM_File    db
  242.     int        optflag
  243.     int        &optval
  244.     int        optlen
  245.  
  246.